# Initial process execs /init.
# This code runs in user space.

#include "syscall.h"
#include "traps.h"


# 此处是initcode.S程序，主要是模拟exec系统调用的环境（将$argv和$init存入栈，在int指令触发系统调用时用到）并触发exec系统调用，在当前进程的虚拟地址空间中装入/init的程序

# exec(init, argv)
.globl start
start:
  pushl $argv # 定义在下面
  pushl $init # 定义在下面
  pushl $0  # where caller pc would be  压入的$0是模拟的返回地址，因为在系统调用之后，控制权将返回到这个地址，但在这里，它被设置为0，因为系统调用不应该返回。？可能在第三章能找到答案
# 压入上面三个参数是手动构建系统调用栈环境，使用int指令触发系统调用后，系统调用会从栈中读取参数

  movl $SYS_exec, %eax # eax寄存器用于传递系统调用编号，即exec系统调用
  int $T_SYSCALL  # 触发中断

# for(;;) exit();
exit:
  movl $SYS_exit, %eax
  int $T_SYSCALL
  jmp exit

# char init[] = "/init\0";
init:
  .string "/init\0"  # exec在当前进程的虚拟内存里装入/init文件里的程序（/init应该是由init.c编译出来的可执行程序）

# char *argv[] = { init, 0 };
.p2align 2
argv:
  .long init
  .long 0

